from django.shortcuts import render
from django.views import View
# 使用HttpResponse返回图片数据
from django.http import HttpResponse
# 使用django_redis模块链接配置文件中的redis数据库
from django_redis import get_redis_connection
from apps.verifications.libs.captcha.captcha import captcha
from apps.verifications.libs.yuntongxun.ccp_sms import CCP

# 导入异步任务方法
from celery_tasks.sms_code.tasks import send_smscode
from django.http import JsonResponse
# Create your views here.
# 随机生成数字
import random


class ImageView(View):
    """
    获取图片验证码
    """

    def get(self, request, uuid):
        # 1、生成图片验证码
        text, img = captcha.generate_captcha()
        # 保存图片验证码到redis中
        # 建立redis链接对象
        conn = get_redis_connection('verify')
        # 将图片验证码的文本数据写入redis中，str类型
        conn.setex('img_%s'%uuid,300,text)

        # content_type指定返回的数据格式
        return HttpResponse(img, content_type='image/jpg')

class SMSCodeView(View):
    """
    发送短信
    """
    def get(self,request,mobile):
        # 补充：频繁发送短信的判断，主要判断两次请求之间的时间间隔是否在一分钟之内，如果在一分钟之内，说明请求过于频繁
        #  建立redis连接获取redis数据
        conn = get_redis_connection('verify')
        # 获取标志数据
        flag_data = conn.get('flag_%s' % mobile)
        # 如果获取到标志数据，说明数据为超过有效期，还在60s内，那么两次请求之间的间隔是在60s,请求过于频繁
        if flag_data:
            return JsonResponse({'code': 400, 'errmsg': '请求过于频繁'}, status=400)

        # 1 获取前段传递的数据 查询字符串数据
        image_code=request.GET.get('image_code')
        image_code_id=request.GET.get('image_code_id')

        # 判断参数是否完整
        if not all([image_code,image_code_id]):
            return JsonResponse({'error':'参数不完整'},status=400)
        # 2 验证数据　验证用户输入的验证码和在ｒｅｄｉｓ中保存的验证码是否一致
        #2-1 建立ｒｅｄｉｓ链接　获取ｒｅｄｉｓ数据
        conn = get_redis_connection('verify')
        # 2-2 从ｒｅｄｉｓ中获取验证码信息　　获取的数据是ｂｙｔｅｓ类型
        real_smscode=conn.get('img_%s' % image_code_id)
        real_smscode = real_smscode.decode()
        # 2-3　比对验证码是否一致
        if real_smscode.lower() != image_code.lower():
            return JsonResponse({'error':'验证码错误'})
        # 3 生成短信验证吗
        sms_code='%06d' % random.randint(0,999999)
        print(sms_code)
        # 4 保存短信验证码
        # conn.setex('sms_code_%s' % mobile,300,sms_code)
        # # 增加判断时间间隔的标志数据
        # conn.setex('flag_%s' % mobile, 60, 'flag_data')
        # 使用管道写入数据
        # 使用pipeline()生成管道对象
        pipe = conn.pipeline()
        # 将radis的写入数据的命令存入管道
        pipe.setex('sms_code_%s' % mobile, 300, sms_code)
        pipe.setex('flag_%s' % mobile, 60, 'flag_data')
        # 执行管道命令
        pipe.execute()
        # 5 发送短信
        # ccp = CCP()
        # ccp.send_template_sms(mobile,[sms_code,5],1)
        # 使用celery异步调用发送短信方法,delay方法中传递参数
        send_smscode.delay(mobile,sms_code)
        #６　返回短信

        return JsonResponse({'errmsg':'ok'})





